iT邦幫忙

2026 iThome 鐵人賽

DAY 26
0

製作好依照分數提升難度的功能,今天就能回來做技能效果了。
前幾天已經完成技能的解鎖圖片,當玩家擊殺數達到50時,技能圖片就會亮起。不過,只有圖片變化還不夠,因此今天決定先製作第一個技能,讓玩家可以消耗擊殺數,一次清除畫面上所有的目標。

修改分數管理程式

首先修改原本的ScoreManager,除了紀錄總分與擊殺數之外,也加入技能的使用條件。

這次的技能需要消耗50點擊殺數。當玩家使用技能時,會先扣除對應的擊殺數,並將技能圖片恢復成暗版,表示技能尚未再次解鎖。

using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class ScoreManager : MonoBehaviour
{
    public static ScoreManager Instance;

    [Header("數據紀錄")]
    public int totalScore = 0;          // 總得分
    public int killedZombieCount = 0;    // 擊殺總隻數

    [Header("UI 顯示元件")]
    public TextMeshProUGUI scoreText;    // 顯示總得分的 Text
    public TextMeshProUGUI countText;    // 顯示擊殺數的 Text

    [Header("技能設定 (清全場) - 50 殺")]
    public Image skillImage;            // 左下角的技能 Image 元件
    public Sprite darkSkillSprite;      // 未解鎖或冷卻中的【暗版圖片】
    public Sprite readySkillSprite;     // 滿 50 殺解鎖後的【亮版圖片】
    public int skillThreshold = 50;     // 解鎖門檻(50 殺)
    
    private bool isSkillUnlocked = false; // 是否已解鎖標記

    private void Awake()
    {
        if (Instance == null) Instance = this;
        else Destroy(gameObject);
    }

    private void Start()
    {
        // 開局預設顯示暗版圖片
        if (skillImage != null && darkSkillSprite != null)
        {
            skillImage.sprite = darkSkillSprite;
        }
        UpdateUI();
    }

    public void AddScore(int amount)
    {
        totalScore += amount;
        killedZombieCount += 1;
        CheckSkillUnlock();
        UpdateUI();
    }

    private void CheckSkillUnlock()
    {
        if (!isSkillUnlocked && killedZombieCount >= skillThreshold)
        {
            isSkillUnlocked = true;

            // 切換為亮版圖片
            if (skillImage != null && readySkillSprite != null)
            {
                skillImage.sprite = readySkillSprite;
            }

            Debug.Log("技能已解鎖!點亮清場技能!");
        }
    }

    // 施放技能:扣除 50 殺並重置圖標為暗版
    public bool UseSkill()
    {
        if (killedZombieCount >= skillThreshold)
        {
            killedZombieCount -= skillThreshold; // 扣除消耗的擊殺數
            isSkillUnlocked = false;

            // 恢復為暗版圖片
            if (skillImage != null && darkSkillSprite != null)
            {
                skillImage.sprite = darkSkillSprite;
            }

            UpdateUI();
            return true;
        }
        return false;
    }

    private void UpdateUI()
    {
        if (scoreText != null) scoreText.text = $"Score: {totalScore}";
        if (countText != null) countText.text = $"Zombies: {killedZombieCount}";
    }
}

建立技能管理程式

接著新增SkillManager,專門負責處理技能的使用。

當玩家點擊技能按鈕時,會先呼叫ScoreManager檢查擊殺數是否足夠。如果成功扣除50點擊殺數,就會尋找場上所有的Target,再逐一呼叫清除目標的方法。

using System.Collections;
using UnityEngine;

public class SkillManager : MonoBehaviour
{
    public static SkillManager Instance;

    private void Awake()
    {
        if (Instance == null) Instance = this;
        else Destroy(gameObject);
    }

    // 點擊按鈕時呼叫此方法
    public void TriggerClearScreenSkill()
    {
        // 嘗試向 ScoreManager 扣除 50 殺,成功才發動技能
        if (ScoreManager.Instance != null && ScoreManager.Instance.UseSkill())
        {
            // 抓出場上所有的 Target(殭屍)
            Target[] allTargets = FindObjectsOfType<Target>();

            foreach (Target target in allTargets)
            {
                if (target != null)
                {
                    // 強制觸發每一隻殭屍的技能清場死亡(算分、算擊殺數並銷毀)
                    target.ForceKillBySkill();
                }
            }

            Debug.Log("【大招發動】全螢幕轟炸清場!");
        }
        else
        {
            Debug.Log("擊殺數不足 50,無法施放技能!");
        }
    }
}

這樣一來,技能按鈕就能透過SkillManager執行清場效果。如果擊殺數不足50,就不會發動技能;達到條件後,便能一次清除場上的目標。

讓技能擊殺也能獲得分數

如果技能只是把殭屍全部消除,卻沒有增加分數與擊殺數,那麼玩家使用技能時反而會失去擊殺殭屍的收益。
因此,我在原本的Target程式中新增ForceKillBySkill(),讓技能消滅全部目標時,也會按照該目標的設定獲得分數,並增加擊殺數。
以下是新增的程式碼:

// 被大招清場時調用(算分、累計擊殺數並銷毀)
    public void ForceKillBySkill()
    {
        if (isDefeated) return;
        isDefeated = true;

        if (targetRoutine != null)
        {
            StopCoroutine(targetRoutine);
        }

        // 結算該殭屍對應的分數與擊殺數
        if (ScoreManager.Instance != null)
        {
            ScoreManager.Instance.AddScore(scoreValue);
        }

        Destroy(gameObject);
    }

第二十六天的成果與之後目標

今天完成了以下功能:

  • 消耗擊殺數:使用技能需要消耗 50 點擊殺數。
  • 全場清除:一次消滅目前場上的所有目標。
  • 技能擊殺計分:被技能消滅的目標同樣會增加分數與擊殺數。
    目前第一個技能已經具備基本的使用功能。接下來會製作第二個技能,讓場上的目標暫時減速,增加玩家反應的時間。

上一篇
Day 25|隨分數提高遊戲難度
下一篇
Day 27|製作全場緩速技能
系列文
從基礎到實作:使用 Google AI 學習程式設計 共 29 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言